#!/bin/bash

# 财务管理系统优化版重启脚本
# 解决启动缓慢问题

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

log_info "正在快速重启财务管理系统..."

# 优化的停止服务函数
fast_stop_services() {
    log_info "快速停止现有服务..."
    
    # 清理所有PID文件
    rm -f "$SCRIPT_DIR"/.*.pid
    
    # 直接强制停止端口占用的进程
    BACKEND_PIDS=$(lsof -ti :8000 2>/dev/null || true)
    if [ ! -z "$BACKEND_PIDS" ]; then
        log_info "停止后端服务..."
        echo $BACKEND_PIDS | xargs kill -9 2>/dev/null || true
    fi
    
    FRONTEND_PIDS=$(lsof -ti :3000 2>/dev/null || true)
    if [ ! -z "$FRONTEND_PIDS" ]; then
        log_info "停止前端服务..."
        echo $FRONTEND_PIDS | xargs kill -9 2>/dev/null || true
    fi
    
    # 短暂等待确保端口释放
    sleep 1
    log_success "服务停止完成"
}

# 优化的启动后端函数
fast_start_backend() {
    log_info "启动后端Django服务器..."
    cd "$SCRIPT_DIR/backend"
    
    # 跳过依赖安装和迁移检查，直接启动
    nohup python3 manage.py runserver 8000 > "$SCRIPT_DIR/backend.log" 2>&1 &
    BACKEND_PID=$!
    echo $BACKEND_PID > "$SCRIPT_DIR/.backend.pid"
    
    # 减少等待时间，快速检查
    log_info "等待后端服务启动..."
    for i in {1..15}; do
        if curl -s http://localhost:8000 > /dev/null 2>&1; then
            log_success "后端服务器已启动 (PID: $BACKEND_PID)"
            return 0
        fi
        sleep 1
    done
    
    log_error "后端服务器启动超时"
    return 1
}

# 优化的启动前端函数
fast_start_frontend() {
    log_info "启动前端React应用..."
    cd "$SCRIPT_DIR/frontend"
    
    # 设置环境变量
    export BROWSER=none
    export CI=true  # 跳过一些检查
    export GENERATE_SOURCEMAP=false  # 跳过sourcemap生成
    
    # 检查node_modules是否存在，如果不存在才安装
    if [ ! -d "node_modules" ]; then
        log_info "安装前端依赖..."
        npm install --silent --no-audit --no-fund
    fi
    
    # 启动前端应用
    nohup npm start > "$SCRIPT_DIR/frontend.log" 2>&1 &
    FRONTEND_PID=$!
    echo $FRONTEND_PID > "$SCRIPT_DIR/.frontend.pid"
    
    # 减少等待时间
    log_info "等待前端服务启动..."
    for i in {1..30}; do
        if curl -s http://localhost:3000 > /dev/null 2>&1; then
            log_success "前端应用已启动 (PID: $FRONTEND_PID)"
            return 0
        fi
        sleep 1
    done
    
    log_warning "前端应用启动超时，但可能仍在编译中..."
    return 0
}

# 快速服务状态检查
quick_check_services() {
    log_info "快速检查服务状态..."
    
    local backend_ok=false
    local frontend_ok=false
    
    # 检查后端
    if curl -s http://localhost:8000 > /dev/null 2>&1; then
        log_success "后端服务运行正常"
        backend_ok=true
    else
        log_warning "后端服务可能还在启动中"
    fi
    
    # 检查前端
    if curl -s http://localhost:3000 > /dev/null 2>&1; then
        log_success "前端服务运行正常"
        frontend_ok=true
    else
        log_warning "前端服务可能还在编译中"
    fi
    
    return 0
}

# 显示重启信息
show_restart_info() {
    echo
    echo "=========================================="
    log_success "财务管理系统快速重启完成！"
    echo "=========================================="
    echo "前端地址: http://localhost:3000"
    echo "后端地址: http://localhost:8000"
    echo "=========================================="
    
    # 显示进程PID
    if [ -f "$SCRIPT_DIR/.backend.pid" ]; then
        echo "后端进程 PID: $(cat $SCRIPT_DIR/.backend.pid)"
    fi
    
    if [ -f "$SCRIPT_DIR/.frontend.pid" ]; then
        echo "前端进程 PID: $(cat $SCRIPT_DIR/.frontend.pid)"
    fi
    
    echo "=========================================="
    echo "日志文件:"
    echo "  后端: $SCRIPT_DIR/backend.log"
    echo "  前端: $SCRIPT_DIR/frontend.log"
    echo "=========================================="
    echo "注意: 如果前端无法访问，请等待编译完成"
    echo "要停止服务，请运行: ./stop.sh"
    echo "=========================================="
}

# 错误处理
error_handler() {
    log_error "重启过程中发生错误"
    
    # 清理可能启动的进程
    if [ -f "$SCRIPT_DIR/.backend.pid" ]; then
        BACKEND_PID=$(cat "$SCRIPT_DIR/.backend.pid")
        kill -9 $BACKEND_PID 2>/dev/null || true
        rm -f "$SCRIPT_DIR/.backend.pid"
    fi
    
    if [ -f "$SCRIPT_DIR/.frontend.pid" ]; then
        FRONTEND_PID=$(cat "$SCRIPT_DIR/.frontend.pid")
        kill -9 $FRONTEND_PID 2>/dev/null || true
        rm -f "$SCRIPT_DIR/.frontend.pid"
    fi
    
    exit 1
}

# 设置错误处理
trap error_handler ERR

# 主执行流程
main() {
    echo "=========================================="
    echo "    财务管理系统快速重启脚本"
    echo "=========================================="
    echo
    
    # 快速停止服务
    fast_stop_services
    
    # 快速启动服务
    fast_start_backend
    fast_start_frontend
    
    # 快速检查服务状态
    quick_check_services
    
    # 显示启动信息
    show_restart_info
}

# 执行主函数
main